/**
  ******************************************************************************
  * @file    WF_Scan.c
  * @author  exatron
  * @version V1.0.0
  * @date    segunda, 22 de dezembro de 2014
  * @brief   Inicia Scan de redes proximas ao roteador, limitando RSSI minimo
  * para entrar na lista.
  ******************************************************************************
  * @attention
  *
  *
  ******************************************************************************
  */

/** @addtogroup WF
  * @{
  */

/* Includes ------------------------------------------------------------------*/
#include <common.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* External functions --------------------------------------------------------*/

/** @defgroup WF_Functions
  * @{
  */

/**
  * @brief  Inicia Scan de redes proximas ao roteador, limitando RSSI minimo
  * para entrar na lista.
  * @param  int rssi: rssi mínimo
  * @retval Devolve pela serial Result_t
  */
void WF_Scan(int rssi)
{
	char line[255], cmd[255], file[255], *arg;
	char parametros[3][200][255];
	int i=0, j=-1;
	int nredes = 0;
	int temp_rssi = 0;
	FILE *fp;

	bzero(line, sizeof(line));
	bzero(cmd, sizeof(cmd));
	bzero(file, sizeof(file));
	bzero(parametros, sizeof(parametros));

	/* Copia o comando para cmd */
	strcpy(cmd,"iwlist wlan0 scanning 2> /tmp/exatron/scanerr | grep -E '(ESSID)|(level)|(Encryption)|(IE: [^U])|(Authentication)' > ");

	/* Guarda o comando em arquivo */
	sprintf(file,"%s%s",PATH_TEMP,"scantemp");

	/* Adiciona o arquivo ao comando */
	strcat(cmd, file);

	/* Executa o comando e salva o conteúdo no arquivo */
	system(cmd);

	fp = fopen("/tmp/exatron/scanerr", "r");
	fscanf(fp, "%s", line);
	fclose(fp);

	if(strlen(line) == 0)
	{
		/* Lê a saida do comando */
		fp = fopen(file, "r");

		while(!feof(fp))
		{
			bzero(line, sizeof(line));
			fgets(line,sizeof(line),fp);

			i=0;
			if((arg=strstr(line,"level=")))
			{
				arg = strrchr(line,'=');
				while(*(arg+i+1) != ' ')
				{
					parametros[0][j+1][i] = *(arg+i+1);
					i++;
				}
				j++;
				strcpy(parametros[2][j],"none");
			}

			i=0;
			if((arg=strstr(line,"ESSID:")))
			{
				arg = strrchr(line,':');
				while(*(arg+i+2) != '"')
				{
					parametros[1][j][i] = *(arg+i+2);
					i++;
				}
			}

			i=0;
			if(strstr(line,"WPA Version 1") || strstr(line,"WPA2 Version 1") || strstr(line,"Encryption key:on"))
			{
				if(strstr(line,"WPA Version 1"))
					strcpy(parametros[2][j],"psk");
				else if(strstr(line,"WPA2 Version 1"))
					strcpy(parametros[2][j],"psk2");
				else
					strcpy(parametros[2][j],"wep");
			}
		}
		fclose(fp);

		bzero(file, sizeof(file));
		sprintf(file,"%s%s",PATH_TEMP,"scanresult");
		/* Escreve o resultado do scan */
		fp = fopen(file, "w");

		/* Conta quantas redes entram */
		for(i=0;i<(j+1);i++)
		{
			temp_rssi = atoi(parametros[0][i])+110;
			if(temp_rssi < 0)
				temp_rssi = 0;
			else if(temp_rssi > 100)
				temp_rssi = 100;

			bzero(parametros[0][i], sizeof(parametros[0][i]));
			strcpy(parametros[0][i], aux_itoa(temp_rssi));

			if(temp_rssi >= rssi)
				nredes++;
		}

		/* Quantidade de redes */
		if(nredes>0)
			fprintf(fp, "%d\n", nredes);
		else
			fprintf(fp, "%d\n", 0);

		for(i=0;i<(j+1);i++)
		{
			if(atoi(parametros[0][i]) >= rssi)
			{
				nredes--;

				if(nredes == 0)
					fprintf(fp, "%s%c%s%c%s", parametros[0][i], 0xFF, parametros[1][i], 0xFF, parametros[2][i]);
				else
					fprintf(fp, "%s%c%s%c%s\n", parametros[0][i], 0xFF, parametros[1][i], 0xFF, parametros[2][i]);
			}
		}
		fclose(fp);

		/* Ativa a flag de scandone */
		sprintf(line,"%d",Result_Ok);
		aux_FileWrLine(PATH_TEMP, "scandone", line, "Erro flag de scandone\r\n");

		aux_USART0_puts("%s=%d\r\n", "WF_SCAN", Result_Ok);
	}else
	{
		aux_USART0_puts("%s=%d\r\n", "WF_SCAN", Result_IoctlError);
	}

	aux_SetBusy(FALSE);
}

/**
  * @}
  */

/**
  * @}
  */
